#ifndef MODBUSMANGER_H
#define MODBUSMANGER_H

#include <QDialog>
#include <QModbusRtuSerialMaster>
#include <QModbusReply>
#include <QDebug>
#include <QSerialPort>
#include<QSerialPortInfo>
#include<QTimer>//定时器
#include <QDateTime>  // 引入QDateTime的定义
#include<userMysql.h>//引入数据库连接类
#include "usermysqls.h"
#include <QQueue>            // 提供 QQueue 容器
#include <QModbusRequest>    // 提供 QModbusRequest 类

struct sensorData
{
    QString Time;//存储当前时间
    int   AirTemperature;//存储空气温度
    int AirHumidity;//存储空气湿度
    int LightIntensity;//光照强度
    int CO2Concentration;//CO2浓度
    int SoilMoisture;//土壤湿度;

};
struct serialPortBolock
{


QString PotrName;
int Baudrate;
int DataBits;
int Parity;//校验位
int StopBits;




};
struct SensorDataAlarmIndex{
    int Index_AirT=0;//存储空气温度警报序列
    int Index_AirH=0;//存储空气湿度
    int Index_Light=0;//光照强度
    int Index_CO2=0;//CO2浓度
    int Index_SoilH=0;//土壤湿度;


};
struct SensorDataAlarmData{
    int Data_AirT=0;//存储空气温度警报第一次数据;
    int Data_AirH=0;//存储空气湿度
    int Data_Light=0;//光照强度
    int Data_CO2=0;//CO2浓度
    int Data_SoilH=0;//土壤湿度;
};
namespace Ui {
class ModBusManger;
}

class ModBusManger : public QDialog
{
    Q_OBJECT

public:
    static int sensorDataCount;
    static int locationCount;
    explicit ModBusManger(QWidget *parent = nullptr);
    ~ModBusManger();
    static ModBusManger* instance();
  void getSensorDataSet();
  void sendSensorDataSet();

  void disConnectDevice();//断连设备
  void reConnectDevice();//重连设别
  bool getModBusDeviceStatus();
private:
    void initModbusDevice();//初始化modbus设备
    bool checkSerialPortExist();//查找串口是否存在
    bool isconnectDevice();//是否连接串口
    void readModsimData();//读取modsim中的数据
    void startPolling();
    void testSensorData();
    //void initModBusDevice_2();//初始化第二台ModBus设备

private:
    Ui::ModBusManger *ui;
    QModbusRtuSerialMaster *modbusDevice;

    QTimer *m_timer;//定义定时器
    int m_retryCount;//当前重试次数
    const int m_maxRetries;//最大重连次数
    QString portName;
    QVector<sensorData> sensorDataSet;
 bool modBusDeviceStatus;//存储Modbus连接状态
 QTimer *timeoutTimer;
 //---------------------------------------------
    QQueue<QModbusDataUnit> requestQueue;
    QQueue<QModbusReply*> replyQueue;
    bool isProcessing = false;
    bool IsProcessing = false;

//     QTimer *timeoutTimer;
//     QModbusReply *currentReply = nullptr;
// bool isPolling=false;
SensorDataAlarmIndex AlarmIndex;
SensorDataAlarmData AlarmData;
private slots:
    void onReadFinished();
    void onModbusError(QModbusDevice::Error error);
    void QTimerReadModsimData();
    void onReadFinished2();
    void onModbusError2(QModbusDevice::Error error);
    void handleConnectionError();
    bool handleRequestError();

    bool reConnectModbusDevice();//重连modbus设备
    void modificationGlobalSensorData();


    void on_pushButtonCancel_clicked();

    void on_pushButtonConfirm_clicked();
    void setAirTemperature(int step);
    void setAirHumidity(int step);
    void setCO2(int step);
    void setLight(int step);
    void setSoilH(int step);
    //int getCurrentSingleSensorData(int address);
    void resetAlarmIndexAndData(int index);
    void autoSetAirTemperature();
    void autoSetAirHumidity();
    void autoSetLight();
    void autoSetCO2();
    void autoSetSoilH();


signals:
    void GlobalSensorDataIsChanged();
    void LcdNumberDispaly(bool ok);
    void sendDynamicCurve();

//    void sendWarningLed(bool ok);//让警报灯变红


};


#endif // MODBUSMANGER_H
